package cn.schoolwow.quickdao.module.database.dml.json.kit;

import cn.schoolwow.quickdao.domain.database.dml.CompareJSONArrayResult;
import cn.schoolwow.quickdao.module.database.parent.kit.DatabaseDAO;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Map;

public interface DatabaseManipulationJSON extends DatabaseDAO {
    /**
     * 获取不符合约束的实例
     * */
    Map<JSONObject,String> getReasonInstanceMap(String tableName, JSONArray instances);

    /**
     * 插入JSON对象
     *
     * @param tableName 表名
     * @param instance  记录
     */
    int insert(String tableName, JSONObject instance);

    /**
     * 插入JSON列表
     *
     * @param tableName 表名
     * @param instances     数据列表
     */
    int insert(String tableName, JSONArray instances);

    /**
     * 忽略插入JSONObject
     * 不存在则插入,存在则忽略
     *
     * @param tableName 表名
     * @param instance  记录
     */
    int insertIgnore(String tableName, JSONObject instance);

    /**
     * 忽略插入JSONArray
     * 不存在则插入,存在则忽略
     *
     * @param tableName 表名
     * @param instances 记录
     */
    int insertIgnore(String tableName, JSONArray instances);

    /**
     * 更新实例
     *
     * @param tableName 表名
     * @param instance 记录
     */
    int update(String tableName, JSONObject instance);

    /**
     * 更新实例
     *
     * @param tableName 表名
     * @param instances 记录
     */
    int update(String tableName, JSONArray instances);

    /**
     * <p>保存对象</p>
     * <p>调用此方法前请先调用uniqueFieldNames方法指定唯一字段</p>
     *
     * @param instance 待保存对象
     */
    int save(String tableName, JSONObject instance);

    /**
     * <p>保存对象</p>
     * <p>调用此方法前请先调用uniqueFieldNames方法指定唯一字段</p>
     *
     * @param instances 待保存数组
     */
    int save(String tableName, JSONArray instances);

    /**
     * 删除实例
     *
     * @param tableName 表名
     * @param instance 记录
     */
    int delete(String tableName, JSONObject instance);

    /**
     * 删除实例
     *
     * @param tableName 表名
     * @param instances 记录
     */
    int delete(String tableName, JSONArray instances);

    /**
     * 比对数据库存在的记录
     *
     * @param tableName 表名
     * @param currentJSONArray 当前存在记录
     */
    CompareJSONArrayResult compareJSONArray(String tableName, JSONArray currentJSONArray);

    /**
     * 比对数据库存在的记录
     *
     * @param tableName 表名
     * @param currentJSONArray 当前存在记录
     * @param totalJSONArray 所有记录
     */
    CompareJSONArrayResult compareJSONArray(String tableName, JSONArray currentJSONArray, JSONArray totalJSONArray);
}